چگونگی بدست آوردن اطلاعات برنامه های نصب شده در سیستم ( مثل محل نصب ,نام برنامه و...)
بسم الله الرحمن الرحیم
خب امروز @lordvandad عزیز باعث شد تا مطلبی رو در مورد نحوه دریافت لیست برنامه های نصب شده روی سیستم بنویسیم .
برنامه ما بصورت زیر هست :
//In the name of GOD
//Seyyed Hossein Hasan Pour
//Ustmb.ir
//Master.huricane@gmail.com
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using WindowsInstaller;
using System.Management;
namespace GetInstalledAppsInfo
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
static int counter_All = 0;
static int counter_installed = 0;
private string GetInfo_ByMsiDll()
{
counter_All = counter_installed = 0;
string installdir="";
Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
//برای فعال شدن اینستالر از بخش ادد رفرنس وارد پوشه ویندوز -سیستم32 بشید و دی ال ال ام اس آی رو انتخاب کنید
//using WindowsInstaller; بعد هم بالا این عبارت رو یوزینگ کنید.
Installer msi = (Installer)Activator.CreateInstance(type);
foreach (string productcode in msi.Products)
{
string productname = msi.get_ProductInfo(productcode, "InstalledProductName");
if (msi.get_ProductInfo(productcode, "InstallLocation")!="")
{
installdir += String.Format("{0} => {1} ",productname, msi.get_ProductInfo(productcode, "InstallLocation") )+ Environment.NewLine;
counter_installed++;
}
else
{
installdir += String.Format("{0} => {1} ", productname ,"{×}") + Environment.NewLine;
}
counter_All++;
}
return installdir;
}
private string GetInfo_ByRegistry()
{
// برنامه هایی که نصب میشن در رجیستری برای انیستالشون مسیر نصب رو قرار میدن
//کافیه ما هم در این بخش لیست برنامه ها رو چک کنیم.
//برای همه برنامه ها جواب نمیده اما تعداد بسیار زیادی رو پوشش میده .برای سایر برنامه هایی که اینجا موفق نبودیم از روشهای دیگه میتونیم استفاده کنیم
string Info = "";
RegistryKey key;
//CurrentUser
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
Info += GetAppsInfo(key);
//LocalMachine_32
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
Info += GetAppsInfo(key);
//LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
if (key != null)//منحصرا مربوط به ویندوزهای 64 بیتی. چون تو این ویندوز امکان اینکه برنامه های 64 بیتی هم باشن هست.اما اگه ویندوز 32 بیتی باشه ما این بخش رو نداریم
{
Info += GetAppsInfo(key);
}
//اگه باز برنامه شما مسیر نصبش مشخص نشد دو دلیل داره یا مدخل جداگانه ای برای خودش با نام خودش درست کرده
//که میتونید با سرچ نامش و چک مدخلهاش اطلاعاتش رو بدست بیارید
//یا اینکه مشکلی وجود داره و اطلاعاتش ناقصه .
return Info;
}
خب توضیحات رو در داخل متن برنامه دادم و چیز زیادی نمونده برای گفتن . جز این مطلب که این روش هایی که بالا استفاده کردم صد در صد تمامی اطلاعات برنامه ها رو بهتون نمیدن اما حدود 82+ درصد رو راحت بهتون میدن .نکته دوم اینکه ممکنه شما بگردید و ببینید از طریق wmi هم میشه این کارو کرد.
درسته که WMI امکانات فوق العاده ای بما میده اما تو این مورد خاص دقت کنید استفاده از WMI و کلاس WIN32_PRODUCTS آثار سویی داره . (در ضمن خیلی هم کنده این مورد)
برای اطلاعات بیشتر پیشنهاد میکنم اینجا رو بخونید : http://gregramsey.net/2012/02/20/win32_product-is-evil/ که برای همین من نحوه کار با اون رو تو برنامه نیاوردم .ازش بشدت پرهیز کنید.
. wmi رو هم اضافه کردم .منتها باید خودتون enableش کنید اگه میخواید تستش کنید.
اگه آدرس محل نصب برنامه رو بدست نیاوردید بهتره بر اساس نام برنامه تو رجیستری سرج کنید و اطلاعات رو بدست بیارید .
امیدوارم به دردتون بخوره .
:areyoukiddingme: وای... خب من که الان احساس جرم می کنم...
بهتر دیدم بجای اینکه تو اون پست خیلی مختصر پیشنهاد استفاده از اینها رو بهت بدم یه نمونه رو تو انجمن بزارم برای رفرنسهای بعدی هم شما مشکلت حل بشه هم کار خودم برای آینده راحت تر بشه.
نحوه استفاده از wmi و کلاس win32_products رو هم اوردم .که اگه خواستید بتونید تست کنید و نتایج رو ببینید.(فقط خیلی کنده )!
امیدوارم مفید بوده باشه برای همتون
علاقه مندی ها (Bookmarks)